#include <FloatArithmetic.h>

#define MAX_ORDER_DIFF 9
#define EXP_ACCURACY 7				//8 in fact
// Factorial n { 2, 6, 24, 120, 720, 5040, 40320 };

static const float InvFact[] = { 0.5f, 0.166666667f, 0.0416666667f,
									0.00833333333f, 0.00138888889f,
									0.000198412698f, 0.0000248015873f 
								};

/*
0,5
0,16666666666666666666666666666667
0,04166666666666666666666666666667
0,00833333333333333333333333333333
0.00138888888888
1,984126984126984126984126984127e-4				
2,4801587301587301587301587301587e-5			
*/

float Exp(float x)
{
	register int i = 0;

	float _x = 0;
	
	if(x == 0)
		return 1;
		
	_x = x;
	
	x = x * InvFact[EXP_ACCURACY - 1];
	x = x + InvFact[EXP_ACCURACY - 2];
	
	for(i = EXP_ACCURACY - 3; i >= -2; i--)
	{
		if(i >= 0)
		{
			x = x * _x;
			x = x + InvFact[i];
		}
		else
		{
			x = x * _x;
			x = x + 1.0f;
		}
	}	
	
	return x - 1.0f;
}
